بسم الله الرحمن الرحيم
 لوحة تحكم العضو تفضل بالتسجيل لدينا التقويم بحث عن أعضاء آخرين منتدى فيجوال بيسك أسئلة وأجوبة بحث في المنتديات الصفحة الرئيسية خروج
منتـــدى فيـجــوال بيـســك منتـــدى فيـجــوال بيـســك أقسام فيجوال بيسك العامة قسم نقاش فيجوال بيسك العام سلسلة دروس تعلــم إنشاء كائنات Activex
عدد الصفحات » (4):   1   2   3   4     الموضوع السابق   الموضوع التالي
الكاتب
الموضوع أكتب موضوع جديد    أكتب رد

رغيد الطيب
طالب لمغفرة الله

تاريخ التسجيل » Dec 2001
البلد » اليمن - عدن
عدد المشاركات » 624
بمعدل » 0.99 مشاركة لكل يوم

السلام عليكم ورحمة الله وبركاته ...

الاخ العزيز فواز بداية جميلة وشرح رائع وكاتب اروع ... اتمنى ان تعرف اخي اننا جميعاً سوف نستفيد من هذة الدروس الجملية بارك الله فيك وجزاك عنا كل الخير ان شاء الله ...

استاذي العزيز اسمح لي ان اجيب على التمرين الذي وضعته لنا وهو : لماذا قمت باضافة 32 الى القيمة KeyCode التابعة للحدث KeyDown ؟

الاجابة : السبب يعود للفرق بين الحروف الانجليزية الكبيرة (Captial Letters) وهي تبدء بالحرف A ورقمه 65 ..... وبين الحروف الانجليزية الصغيرة (Small Letters) والتي تبدأ بالحرف a ورقمه 97 وبالتالي فان :

code:
97 - 65 = 32

ولان البارميتر KeyCode يعود فقط بقيم الحروف الكبيرة سواءً كان الضغط على حرف كبير ام صغير فالقيمة الراجعة دائماً هي قيمة الرقم الكبير ... وكما ذكرت اخي يمكن ان يتم استخدام الحدث KeyPress ومعامله KeyAscii لمعرفة الحرف الذي ضغط هل هو كبير ام صغير (اي الرقم الصحيح للحرف المضغوط) ...

واما اذا كان المستخدم مصراً على استخدام KeyDown ويريد ان يعرف الرقم الصحيح للحرف المضغوط فيمكن التلاعب قليلاً وفحص حالة البارميتر Shift كالتالي :
code:
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
    If Shift = 1 Then
       Caption = KeyCode
    Else
       Caption = KeyCode + 32
    End If
End Sub

وبالتالي فاذا كان الـ Shift لا يساوي واحد فان المفتاح Shift يكون غير مضغوط وهنا نضيف 32 للحصول على الرقم المرتبط بالحرف الصغير .. (هذا بفرض ان زر CapsLock غير نشط ) ...
[/code]

اخي العزيز اكرر شكري لك على هذا الدرس الرائع وكلي ثقة من اني سوف استفيد كثيراً ان شاء الله تعالى ...

والسلام عليكم ورحمة الله وبركاته ....


__________________
يقول الله تعالى في حديثه القدسي :
إني والأنس والجن في نبأ عظيم ، أخلق ويُعبد غيري ، وأرزق ويشكر سواي ، خيري إلى العباد نازل ، وشرهم إلي صاعد ، أتحبب إليهم بنعمي وأنا الغني عنهم ، ويتبغضون إلي بالمعاصي وهم أفقر شيء إلي .

-------------------------- آخر موضوع ------------------------------------

برنامج لإضافة شعارك لخصائص النظام
شريط عمليات - بمظاهر اكثر جاذبية

-------------------- مواضيع السلسة الذهبية ---------------------------

السلسلة الذهبية في المواضيع العلمية [ تقنية الإستدعاء الذاتي Recursion ]
السلسلة الذهبية في المواضيع العلمية [ كيف نحل مشاكلنا بأنفسنا ؟ ]
السلسلة الذهبية في المواضيع العلمية [ المعاملات المنطقية فائدتها واستخداماتها ]

------------------------- مواضيع حديثة ----------------------------------
تعديل وتحسين قائمة ابدء
حفظ الصور بصيغة JPG
صور متحركة على سطح المكتب
قراءة الارقام بالصوت!
التحكم في الألوان الصور
مناقشة حول إعادة تشغيل الوينذوز
حل لعبة أبراج هانوي
------------------------- مواضيع قديمة ---------------------------------
الربط بين الاجهزة
إصنع شاشة توقف بنفسك!
إنشاء إمتداد خاص ببرنامجك
تقسيم الملفات الكبيرة
تنبيه إذا نسيت احد الاقراص
رسم وتدوير الكائنات الثلاثية الابعاد
ساعة الحائط
عيون تنظر الى الماوس
----------------------- مجموعة اللعاب ---------------------------------
لعبة الهروب الكبير
كرة متحركة
سباق السيارات
----------------------- مجموعة ادوات ----------------------------------
مربع قائمة متعدد الالوان
عرض المجلدات بطريقة الوينذوز
تثبيت الادوات داخل الفورم
ازرار الوينذوز XP
عرض الصور بطريقة مميزة
اداة ProgressBar المعدلة

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

رغيد الطيب غير متصل Old Post 09-07-2003 05:00 AM
إضغط هنا لمشاهدة هوية رغيد الطيب إضغط هنا لإرسال رسالة شخصية لــ رغيد الطيب إضغط هنا لإرسال بريد لــ رغيد الطيب تفضل بزيارة صفحة رغيد الطيب إبحث عن مواضيع رغيد الطيب أضف رغيد الطيب إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

ملاحضة : في البداية أعتذر عن الأخطاء الإملائية وأيضا هناك نقص في الفائدة للحدث الخامس MousDown فهوا يفيد عند ضغط زر الماوس الأيمن أو الأيسر وليس كما هوا مكتوب سابقاُ بسبب سرعتي في الكتابة لم أنتبه لهذا .فودت التنبيه .

بسم الله الرحمن الرحيم
أشكرك أخي رغيد وبارك الله وفيك وفعلاً إجابة السوأل هوا ماذكرت وكان بودي أن أضع جدول أسكي كامل بشفرة html لكنها ليست مفعلة في المنتدى . سوف أحاول إيجاد طريقة حتى يكون هذا الجدول مرجع عام لنا .

الدرس الرابع ( مهم جداً ) :
سوف نأخذ مجموعة من الأحداث الخاصة بنافذة التصميم لذا سيعتبر هذا الدرس مع الدرس السابق( مرجع لنا عند التصميم)

الأحداث الخاصة :
كما سبق وأن عرفتها : فهي تلك الأحداث التي ليس للماوس أو لوحة المفاتيح بها دخل , وهي مسئوله عن تنفيذ عمل خاص بنافذة أو أداة معينة , وسوف أذكر بعض تلك الأحداث مقارناً بها مع الأحداث الخاصة الجديدة التي تتبع نافذة التصميم UserControl وسوف أذكر بعض الأحداث الهامة في نافذة Form والتي تكون قريبة أو شبيهة العمل مع أحداث UserControl وأول حدث سوف أتكلم عنه هوا :
-------------------------------------------
1- حدث : Form_Load :

code:
 Private Sub Form_Load()

End Sub 

هذا الحدث التابع للنموذج Form : وضيفة هامة جداً فهوا المسئول عن تنفيذ مهمة معينة قبل أن تظهر النافذة أي أثناء تحميلها للذاكرة , واعتقد أن أغلبنا يعرف هذا الحدث وفيما يستخدم فيمكن مثلاً في هذا الحدث أن نضع قيم افتراضية للمتغيرات أو نستدعي إجراء أو غيرها من الوظائف .
-------------------------------------------
2 - حدث UserControl_Initialize :
code:
 Private Sub UserControl_Initialize()

End Sub 

هذا الحدث هوا أول حدث من الأحداث الخاصة بنافذة التصميم UserControl وهذا الحدث يقابل حدث Form_Load تقريباً , فهذا الحدث يبدأ بالعمل عند إنشاء أي فرد من الكائن (واحد من الكائن الجديد) أثناء التصميم (على نافذة Form) أو أثناء تشغيل البرنامج :
ملاحظة هامة جداً :
عند ما نقوم بوضع الأداة الجديدة والتي قمنا بتصميمها على نافذة Form يعتبر محرك Visual Basic الأداة كبرنامج مستقل , فلو حدث خطأ ما مثلاً في الأداة أثناء وضعها على نافذة Form ستظهر رسالة تخبرك بالخطأ ثم ينتقل بك (المفسر) إلى شفرة نافذة التصميم UserControl موضحاُ الخطأ كعادة مفسر الـVisual Basic بخلفية صفراء على السطر الخطأ .
لذلك يبدأ المفسر بترجمة الأداة وتنفيذها لحظة وضعها على النافذة Form ابتدأً من الحدث UserControl_Initialize لذا يمكن الاستفادة منه في وضع قيم افتراضية للمتغيرات أو غيرها من الاحتياجات التي يحتاجها المصمم كاستدعاء إجراء .....الخ
-------------------------------------------
3 - UserControl_Show
ووضيفة هذا الحدث تنفيذ مهمة ما عندما يتم تغير خاصية Visible إلى True
code:
 Private Sub UserControl_Show()

End Sub 

ملاحظات توضيحية حول الحدث :
1- عند ما تكون خاصية Visible للكائن الذي أنشأناه False فعند تشغيل البرنامج لن يعمل الحدث , بمعني في هذه الحالة هوا في إجازة من العمل ...! بينما إذا كانت خاصية Visible هي True فسينطلق بعد الحدث UserControl_Initialize مباشرة ( UserControl_Show ) .

لو قمنا بوضع زرين أمر ثم وضعنا بجانبهم الأداة التي أنشأناها ووضعنا في الزر الأول الخاصية Visible إلى True بينما الزر الثاني وضعنا الخاصية Visible بـ False طبعاُ الخاصية التابعة لكائن الذي أنشأناه . فمتي سيعمل هذا الحدث .... أتمنا الإجابة على هذا السؤل في مشاركاتكم حتى أشعر أنكم قد استو عبتم هذه الأحداث .

2- لا تستقبل الأداة(الجديدة التي صممناها) الحدثShow إذا كان النموذج (Form) مخفياً وعرض ثانية , أو إذا كان النموذج (النافذة Form ) مصغراً وتم استرجاعه , لآن الأداة الجديدة (التي صممناها) تضل في النموذج ولا تتغير في هذه العمليات خاصيتها Visible .

3- إذا تم استخدام الأداة في تصمم صفحات إنترنت (وتم استعراضها في المتصفح ) فأن الحدث Show يعمل في حال تراجع المستخدم إلى الصفحة التي تحوي الأداة المصممة .

4- في الإصدارات السابقة قبل الإصدار 5.0 من Visual Basic لا تستقبل الأداة المصممة الحدث Show في زمن التصميم , ويقصد بذلك أثناء وضعها على النموذج Form أثناء تصميم البرنامج , بينما في الإصدارات التالية تستقبل الأداة المصممة الحدث أثناء التصميم , وأيضاُ أثناء التشغيل, راجع ملاحظة الحدث Initialize .
-------------------------------------------
4- UserControl_Resize
يقع هذا الحدث أو يعمل إذا تم تغير حجم الكائن سواء تكبير أو تصغير أو تغير الاتجاهات
code:
 Private Sub UserControl_Resize()
 
End Sub 

واعتقد أن هذا الحدث مألوف لدي الكثير من مبرمجي فيجول بيسك ولهذا الحدث خصائص متعلقة به وهي على النحو التالي
1- خاصية Height : فعند استخدام هذه الخاصية والتي وضيفتها تكبير الكائن بالنسبة للمستوى العمودي (y) إلى الأسفل أو تصغيره إلى الأعلى , وهذا بدورة سينطلق الحدث Resize , لأن هناك تغير حصل في هذا الكائن .
2 - خاصيةWidth : وهي تتحكم في تكبير عرض الكائن إلى الأمام أو العكس تصغير
3 - Top : وهي تتحكم في تغير ارتفاع الكائن والارتفاع يعني تغير موضح الكائن الحالي لذا سيعمل الحدث Resize .
5 - Left : وهذه الخاصية تتحكم في تغير الموضع الحالي للكائن بالتدريج من اليمين إلى اليسار .

فيعند تغير هذه الخصائص سينطلق الحدث Resize بسبب تغير موضع الكائن .
وهناك خصائص أخري مثل : ScaleWidth , ScaleHieght , ScaleTop , ScaleLeft , وهذه الخصائص كثير ما سنستخدمها في تحديد المساحة الداخلية للكائن علما أن هذه الخصائص تختلف عن الخصائص المذكورة في النقاط السابقة . ما ادري كيف أوضحها هذه بس راح أحاول :
الخصائص السابقة , Height , Width , Top, Left , تستخدم لتحكم في المساحة الكلية للكائن مثل تغير في الارتفاع (الحجم) أو تغير الموقع الحالي للكائن بينما الخصائص ScaleWidth , ScaleHieght , ScaleTop , ScaleLeft تستخدم في تحديد المساحة الداخلية للكائن , حيث يمكن عن طريق هذه الخصائص تحديد المساحة الداخلية العليا أو اليسارية مثلاً لنرسم شيء معين في الكائن من حوافه كمستطيل .....الخ ... سنستخدم هذه الخصائص عند رسم الزر لذي سنصممه .

وعادة الخصائص ScaleWidth , ScaleHieght , ScaleTop , ScaleLeft تتعامل مع خاصية هي ScaleMode والتي تحدد نوع وحدة القياس لنضام الإحداثيات , تفيد عند استخدام دوال الرسم على الكائن في تحديد طريقة القياس لإحداثيات الرسم , وهذه الأنواع من القياس هي :

القيمة الثابت الوصف
0vbUser فيد بأن الخصائص ScaleWidth , ScaleHieght , ScaleTop , ScaleLeft
قد ضبطت بوحدة قياس مخصصة (حيث يمكن إنتاج وحدة قياس غير المذكورة) .
vbTwips 1 (دائماً افتراضية) و التويب (1440 تويب في كل إنش ,567 تويب في كل سم) .
vbPoints 2 (72 نقطة في كل إنش) .
vbPixels 3 بيكسل (أصغر وحدة دقة للشاشة أو الطابعة ) .
vbCharacters 4 محرف (أفقياً = 120 تويب في كل وحدة , عمودياً = 240 تويب في كل واحدة ).
vbInches 5 إنش .
vbMillimeters 6 ملليمتر .
vbCentimeters 7 سنتيمتر .

وهناك ملاحظات على هذه الخاصية كثيرة ولكن سأتحدث فقط بما يتناسب مع الأداة التي سنقوم بتصميمها .
-------------------------------------------------------
5 - حدث UserControl_Paint :
يقع هذا الحدث عند وضع الكائن على النافذة Form , أو إذا تم تكبير الكائن أو تصغيره , أو إذا وضع كائن ما على الكائن الخاص بنا , أو إذا وضع جزء من كائن عليه , أي تغطى جزء من كائنا . قريب نوعاً ما من حدث Resize .
code:
 Private Sub UserControl_Paint()
 
End Sub 

على سبيل التوضيح قم بالتالي :
في نافذة UserControl غير خاصية BackColor إلى ألون الأسود ثم ضع الكود MsgBox "Piant" في الحدث ثم قم بإغلاق النافذة , وهذه الخطوة مهمة جدا جداً التي هي إغلاق النافذة UserControl حيث لن تتمكن من وضع الكائن على نافذة Form في حال كانت نافذة UserControl مفتوحة سواء واجهة الكود أو واجهة التصميم لذا انتبه لهذه الخطوة , فإن رأيت رمز الكائن على شريط الأدوات غير مفعل فعلم أنك لم تقم بإغلاق نافذته , بعد ذلك ضع الأداة على النافذة Form ستلاحظ ظهور الرسالة المذكورة وعند تحريكه لن تظهر الرسالة ولكن جرب أن تقوم بتكبيره أو تصغيره سوف تلاحظ ظهور الرسالة (باستخدام الماوس) أما إذا قمت بتحريكه باستخدام لوحة المفاتيح فسيقع الحدث وتظهر لك الرسالة (يتم التحريك كما يلي : قم بالتأشير على الكائن ثم اضغط مفتاح Ctrl وضغط أحد الأسهم كرر الضغط على السهم لتحريك الكائن ) , ولكي يتبين كيف يقع الحدث عند وقوع كائن علية قم بوضع زر أمر ليغطي نصف الكائن ثم قم بتحريك الكائن ليظهر الجزء المغطى وهكذا...... .
ملاحظة :
إذا تكررت الرسالة بحث لم تعد قادراً على الرجوع للنموذج اضغط مفتاح Ctrl + Pause Break بعدها 'ضغط زر التوقيف .
فيفيد هذا الحدث للتأكد من رسم عملية على الكائن مرة أخرى , في حال استخدم في الكائن دوال رسم .
كنت فيما سبق اذكر أن حدث قد يرتبط بخاصية معينة ولكن في هذا الحدث سيرتبط مع خاصية (Properties) وطريقة (Method) حيث تستدعي الطريقة Refresh الحدث Piant بينما الخاصية AutoReDraw إذا كانت بـTrue في هذه الحالة سيكون إعادة الرسم أو التلوين تلقائياُ . لذا إذا كانت الخاصية AutoReDraw بـTrue لن يكون لهذا الحدث أي فائدة لأن هذه الخاصية تحل محل هذا الحدث . حيث ألياُ تسمح بإعادة رسم النماذج وصناديق الصور. وتكتب النصوص والصور على الشاشة , ويحفظ صورة عنها في الذاكرة وعند ذلك لا حاجة لأن يتلقى الكائن حدث الرسمPiant بغية إعادة الرسم إذا كان الرسم يعاد تلقائياُ من محتويات الذاكرة .
--------------------------------------------------
6 - حدث UserControl_Terminate
وضيفة هذا الحدث تماماُ هي وضيفة حدث Form_Unload حيث يعمل هذا الحدث عند حذف فرد من أفراد الكائن من على النافذة Form ليقوم بتفريغ الذاكرة من الجزء الذي كان حاجزه فيها .

ملاحظة :
عندما أتحدث عن فرد من أفراد الكائن , توضيح : الكائنات تقسم حسب وضعها إلى عائلات حيث مثلاً لو وضعت زر أمر على النافذة ثم قمت بتغير اسمه , فسيعتبر هذا الزر من عائلات CommandButton , وهوا عند وضعه في النموذج يمثل فرد من أفراد العائلة CommandButton , بينما صندوق النص Text1 يمثل فرد من عائلة TextBox وهكذا , لذا نحن عندما نصمم كائن سنحدد العائلة الذي ينتمي إلية الكائن , عند تغير إسم كان أنضر لعنوان نافذة الخصائص حيث تعرض عالة الأداة مع الاسم الحالي الذي قام المستخدم بتغيره (أو لم يغيره) حيث إسم الكائن بالخط العريض بينما العائلة بالخط المجاور.

سأقوم بتوضيح الحدث Unload التابع للنافذة Form كما يلي .
---------------------------------------------------
7- الحدث Form_Unload
يقع هذا الحدث عند إنهاء البرنامج ليقوم بحذف( تفريغ ) النموذج Form من الذاكرة :
code:
 Private Sub Form_Unload(Cancel As Integer)

End Sub 

وهناك باراميتر لهذا الحدث وهوا Cancel As Integer حيث يفيد هذا الجزء أو الباراميتر في إلغاء أمر إنهاء البرنامج أو
تفعيله بالنسبة لزر الإغلاق الموجود على شريط العنوان الذي يحمل شكل(x) فعندما يعطي الباراميتر القيمة 1 فسيمنع عمل
زر الإغلاق أما إذا كانت القيمة 0 فسيتيح الإغلاق باستخدام زر الإغلاق يوضح المثال التالي كيف يمكن عدم تفعيل زر الإغلاق الخاص بالنافذة
code:
 Private Sub Form_Unload(Cancel As Integer)
Cancel = 1
End Sub 

راجع تقنية الاستدعاء الذاتي الذي تكلم عنه الأخ العزيز رغيد الطيب .
-----------------------------------------
8 - الحدث UserControl_LostFocus :
يستخدم عندما يذهب التركيز عن الكائن أو ينتقل إلى كائن أخر .
code:
 Private Sub UserControl_LostFocus()

End Sub 

ملاحظة جداً مهمة لنا كمصممين :
يعتبر هذا الحدث خاص بنافذة UserControl (طبعاً هناك بعض الأحداث سيرثها الكائن من نافذة التصميم منها هذا الحدث , وغيرها من الأحداث التي سيتم توضيحها في الدروس القادمة ) ويختلف عن الحدث المعروف LostFocus الذي يعالج الأدوات المنتجة وإنما هذا الحدث هوا لغرض داخلي يستفيد منه المصمم فيفيد هذا الحدث في معرفة ما إذا كان التركيز علية الآن أم لا لرسم التركيز على الزر أو لتنفيذ مهمة ما .
الخاصية المرتبطة مع الحدث :
خاصية CanGetFocus عندما تكون بـTrue تتيح للكائن أن يحصل على التركيز , وليس هناك أدوات أخرى يمكن أن تتلقى التركيز .
ملاحظة :
يطلق الحدث LostFocus قبل الحدث ExitFocus .
-----------------------------------------
9 - UserControl_ExitFocus
ينفذ هذا الحدث عند مغادرة التركيز أحد أفراد للكائن .
code:
 Private Sub UserControl_ExitFocus()

End Sub 

يفيد هذا الحدث إذا احتاج الكائن معرفة إن كان التركيز يغادره الآن . حيث يقع مباشرة بعد الحدث رقم 9 .
----------------------------------------
10 - الحدث UserControl_EnterFocus
ينفذ هذا الحدث عندما يدخل التركيز إلى أحد أفراد الكائن
يفيد في معرفة ما إذا كان الحدث يقع الآن بداخلة أم لا .

ملاحظة :

يقلع هذا الحدث قبل الحدثGotFocus .
---------------------------------------
11 - الحدث UserControl_GotFocus :
يستخدم في حال انتقل التركيز من كائن ما إلى الكائن الحالي (المصمم) . حيث هذا الحدث خاص بالمصمم لمعرفة فيما إذا انتقل التركيز إلى الكائن الحالي (المصمم) أم لا وليس كالحدث العام GotFocus الذي يستخدمه المبرمج والذي يحدد التركيز بالنسبة للكائنات بشكل عام .

سؤال مهم جداُ جداُ .........الخ :
أعتقد قطعاً ورود سؤل ما هوا الفائدة من استخدم EnterFocus طالما أن الحدث GotFocus يقوم بالمهمة :
أيضاُ الحدث ExitFocus طالما أن الحدث LostFocus يقوم بنفس المهمة لآني سألت نفسي هذا السؤل من قبل وتوصلت للناتج بعد عناء وهوا التالي :
ذكرت في ملاحظة سابقة أن هناك عائلات من الكائنات عند وضع فرد من العائلة في النافذة يعتبر هذا فرد من أفراد كائن (راجع الملاحظة السابقة )
لذلك ينفذ الحدثين GotFocus و LostFocus في حال وجد أي فرد من أفراد العائلة فإذا انتقل التركيز لفرد ثاني من أفراد العائلة لن تنفذ هذه الأحدث لأنها في حال وجدت أي فرد من العائلة تتوقف من العمل لذلك وجدت الأحداثExitFocus و EnterFocus لتقوم بفحص التركيز في حال تم انتقاله بين أفراد الكائن . مثلا لو قمنا بتصميم كائن (زر) وعند وضع الزر على النموذج وكان بجانبه أداة نص مثلاً فعند انتقال التركيز من أداة النص إلى الزر فسيقع الحدث GotFocus بينما العكس سيقع الحدث LostFocus , طيب الآن لو قمنا بوضع زر بجانب الزر الأول (المصمم - يعني من نفس العائلة ) ثم نقلنا التركيز إلى الزر الأول فسيقع الحدث GotFocus ثم بعد ذلك نقلنا التركيز إلى الزر الثاني والذي هوا من نفس العائلة ففي هذه الحالة لن ينفذ حدث GotFocus لأن هذا الحدث كما ذكرت وضيفته العمل عند ما يقع أول مرة على فرد من العائلة فإذا تكرر الفرد لن يعمل وسيعمل عند التنقل بين أفراد العائلة الحدث (إذا وقع التركيز على الفرد) EnterFocus

أتمنا أن تكون هذه الملاحظة وفت بالإجابة
ويمكن اختبار الأحداث المذكورة بوضع رسالة معينة بداخل كل حدث وعند وضع عدد من الكائن على النموذج جرب النقر على الأول وأنضر الرسالة ثم الثاني ثم انتقل إلى عائلة ثانية كصندوق النص ثم عود ونقر على أحر أفراد الكائن وهكذا لترى الفرق .
---------------------------------------------------------------------------
أشعر أن الدرس قد طال نوعا ما وبه معلومات هامة لذا أرجو الإطلاع عليها والتفكر بها جيداً لأن عملنا منصب على هذه الأحدث , وإن لم يفهم حدث نضراُ لعدم فهم المصطلحات الخاصة به فأقول أننضر قلياً حتى نبدأ بالتعامل معها لتفهمها أكثر .

في حال ورود ملاحظة أو إضافة يسرني ذكرها .

وإلى اللقاء في الدرس القادم الذي لا أعرف هل سوف أواصل بالأحداث ثم الدوال أو أبدأ بشرح طرق برمجة الخصائص فالأمر مطروح لكم فماذا تريدون .

السلام عليكم ورحمة الله وبركاته .


__________________
الإيمان يمان والحكمة يمانية

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 10-07-2003 07:07 AM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

فتى فيجوال
مبرمج متمكن

تاريخ التسجيل » Dec 2002
البلد » المملكة العربية السعودية
عدد المشاركات » 403
بمعدل » 1.53 مشاركة لكل يوم

جزاك الله خيراً على هذا الشرح الجميل .

فعلاً جهد كبير وتستحق عليه الشكر الجزيل .


__________________
* من استغفر للمؤمنين وللمؤمنات كتب الله له بكل مؤمن ومؤمنة حسنة .
* من قال سبحان الله العظيم وبحمده غرست له نخلة في الجنة .
* من قرأ آية الكرسي عقب كل صلاة مكتوبة لم يبق بينه وبين الجنة إلا أن يموت .
* من قال رضيت بالله رباً وبالاسلام ديناً وبمحمد صلى الله عليه وسلم نبياً ورسول كان حقاً على الله أن يرضيه .
* من توضأ فقال أشهد أن لا إله إلا الله وحده لا شريك له وأشهد أن محمداً عبده ورسوله فتحت له أبواب الجنة الثمانية يدخل من أيها شاء .
* من قال سبحان الله وبحمده مائة مرة حطت عنه خطاياه وإن كانت مثل زبد البحر .
* من قال حسبي الله لا إله إلا هو عليه توكلت وهو رب العرش العظيم كفاه الله ما أهمه .


برنامج لإدخال الروابط والصور والأكواد .... إلى المنتدى
للمبتدئين : التعامل مع أشرطة الأوامر والقوائم المنبثقة
للمبتدئين : التعامل مع App.path
برنامج لتسهيل عرض وحفظ الأوامر بالكود + مجموعة أكواد كمثال
للمبتدئين : طرق استخراج الألوان وعمل التدرجات المختلفة
للمبتدئين : كل ما تريد معرفته عن الوقت - التاريخ - والأدوات المتعلقة بهما

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

فتى فيجوال غير متصل Old Post 10-07-2003 03:37 PM
إضغط هنا لمشاهدة هوية فتى فيجوال إضغط هنا لإرسال رسالة شخصية لــ فتى فيجوال إضغط هنا لإرسال بريد لــ فتى فيجوال إبحث عن مواضيع فتى فيجوال أضف فتى فيجوال إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

elbsfawy
مبرمج نشيط

تاريخ التسجيل » Aug 2002
البلد » مصر
عدد المشاركات » 179
بمعدل » 0.45 مشاركة لكل يوم
شكراً اخى الفاضل

بسم الله الرحمن الرحيم
الاخ الفاضل سلام الله عليكم ورحمة الله وبركاته
والله انا الان اسعد عضو فى المنتدى بمبادرتكم الكريمة لوضع مثل هذه الدروس المهمة
ولكم طلبت هذا الدرس من قبل ولكم طلبت فتح قسم خاص لدراسة هذة الادوات
والحمد لله الذى شرفنا بأخ كريم يعلمنا ما نحتاجه
وشكراً ووفقك الله


__________________
سبحان الله وبحمده
سبحان الله العظيم

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

elbsfawy غير متصل Old Post 10-07-2003 05:42 PM
إضغط هنا لمشاهدة هوية elbsfawy إضغط هنا لإرسال رسالة شخصية لــ elbsfawy إبحث عن مواضيع elbsfawy أضف elbsfawy إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

amrmagdy
محلل ومصمم نظم

تاريخ التسجيل » Mar 2003
البلد »
عدد المشاركات » 96
بمعدل » 0.51 مشاركة لكل يوم
جدول آسكى كود

شكرا جزيلا للأخ فواز وأيضا للأخ العزيز جدا رغيد الطيب أردت المساهمه ولو بقدر ضئيل بعد أذنكم هذا هو جدول الآسكى بالكامل

لتنزيل الملف المرفق أنقر الرابط التالي: ascii code.zip بلا مسؤلية على المنتدى إن كان المرفق يحتوي على فيروسات أو وسائل تجسس
تم تحميل هذا الملف 110 مرة.

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

amrmagdy غير متصل Old Post 10-07-2003 07:01 PM
إضغط هنا لمشاهدة هوية amrmagdy إضغط هنا لإرسال رسالة شخصية لــ amrmagdy إضغط هنا لإرسال بريد لــ amrmagdy إبحث عن مواضيع amrmagdy أضف amrmagdy إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

الصلوي
عضو نشيط

تاريخ التسجيل » Mar 2003
البلد » اليمن
عدد المشاركات » 70
بمعدل » 0.36 مشاركة لكل يوم

مشكور اخي فواز والله مش عارفين كيف نشكركم على المجهود الي تبذلوه في المنتدى ولكن لا يسعنا الا ان نقول بارك الله فيكم وجعله الله في ميزان حسناتكم وجزاكم الله الف خير


__________________
عاشق الفيجول بيسك

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

الصلوي غير متصل Old Post 10-07-2003 08:21 PM
إضغط هنا لمشاهدة هوية الصلوي إضغط هنا لإرسال رسالة شخصية لــ الصلوي إضغط هنا لإرسال بريد لــ الصلوي إبحث عن مواضيع الصلوي أضف الصلوي إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

abudosa
مبرمج مصري محترف

تاريخ التسجيل » Jul 2002
البلد » مصر
عدد المشاركات » 184
بمعدل » 0.43 مشاركة لكل يوم

شكرا لك يا أخ فواز

فعلا شرحك ممتاز


__________________
أحمد عبد الرازق أحمد
a2000abdo@hotmail.com
مبرمج مصري 18 سنة ( عااااااااااااااااشق البرمجة )
----------------------------------------
----------موضوعاتي----------
كيفية تعريب برنامجك تعريب كامل بأستخدام تقنية المرآه وتعريب أزرار الرسائل

مكتبة DLL من تصميمي لتشفير وفك تشفير الملفات

كراك أكتيف سكين للأصدارة 4.3 تم كسر الحماية بواسطة abudosa

----------------------------------------
عاشق البرمجة
اسير الحب أشد الرومانسية
---------------------------------------

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

abudosa غير متصل Old Post 11-07-2003 04:24 AM
إضغط هنا لمشاهدة هوية abudosa إضغط هنا لإرسال رسالة شخصية لــ abudosa إضغط هنا لإرسال بريد لــ abudosa تفضل بزيارة صفحة abudosa إبحث عن مواضيع abudosa أضف abudosa إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

abudosa
مبرمج مصري محترف

تاريخ التسجيل » Jul 2002
البلد » مصر
عدد المشاركات » 184
بمعدل » 0.43 مشاركة لكل يوم

شكرا لك يا أخ فواز

فعلا شرحك ممتاز وانا استفدت منه كثيرا


__________________
أحمد عبد الرازق أحمد
a2000abdo@hotmail.com
مبرمج مصري 18 سنة ( عااااااااااااااااشق البرمجة )
----------------------------------------
----------موضوعاتي----------
كيفية تعريب برنامجك تعريب كامل بأستخدام تقنية المرآه وتعريب أزرار الرسائل

مكتبة DLL من تصميمي لتشفير وفك تشفير الملفات

كراك أكتيف سكين للأصدارة 4.3 تم كسر الحماية بواسطة abudosa

----------------------------------------
عاشق البرمجة
اسير الحب أشد الرومانسية
---------------------------------------

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

abudosa غير متصل Old Post 11-07-2003 04:33 AM
إضغط هنا لمشاهدة هوية abudosa إضغط هنا لإرسال رسالة شخصية لــ abudosa إضغط هنا لإرسال بريد لــ abudosa تفضل بزيارة صفحة abudosa إبحث عن مواضيع abudosa أضف abudosa إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

بسم الله الرحمن الرحيم
إخواني الكرام سرني كثير والله الحمد أنكم قد فهمتم الدروس السابقة , حيث كنت أظن أن الشرح ينقصه سهولة سرد المعلومات , فالحمد الله على ذلك .

سوف أحاول ربط الأحداث مع الخصائص أثناء تصميم الكائن بدلاً من تجزئها :

الدرس الخامس :
برمجة الخصائص :
الآن بعد الدروس السابقة يمكننا البدء عملياً في إنتاج كائنات Ocx :

برمجة الخصائص :
حيث عندما نقوم ببرمجة خاصية جديدة للكائن يجب أن نفهم أولاً : أن هناك ثلاثة أنواع من الخصائص :
1- خصائص مبنية على نافذة التصميم UserControl .
2- خصائص مبنية على كائن موجود على نافذة UserControl
3- خصائص جديدة يحددها المصمم .

( راجع الدرس الثاني )

الإجراءات العامة لبرمجة الخاصية :
الإجراء الأول :

code:
Public Property Get NameOFProperty() As Variant

End Property

الإجراء الثاني :
code:
Public Property Let NameOFProperty(ByVal vNewValue As Variant)

PropertyChanged "NameOFProperty" 
End Property 

الإجراء الأول :
ينطلق عندما يتم إعطاء قيمة الخاصة لمتغير أو لأي كائن أخر مثال :
هذا المثال (بافتراض تسمية الكائن المصمم بـButton والخاصية التابعة له بـ (Caption :
code:
Text1.Text = Button1.Caption

شرح أجزاء الإجراء :
Public : وهذا يحدد أن الخاصية عامة فإذا تم وضع Private بدل عنه فلن يتم وضع الخاصية في نافذة الخصائص لذا يجب تركهPublic , ( جرب ذلك ) .
Property Get : تحدد أن الإجراء هوا عبارة عن إجراء خاصية .
تسمح بإعطاء قيمة الخاصية لمتغير أو خاصية .
NameOFProperty : يمثل اسم الخاصية فمثلاً يمكن أن تكتب BackColor أو غيرها .
الإجراء الثاني :

ينطلق عندما يتم تغير القيمة السابقة للخاصية إلى قيمة جديدة مثلاُ :
code:
    Button1.Caption = Text1.Text 

حيث الباراميتر الموجود به : vNewValue يحصل على القيمة الجديدة ويكون نوع هذا الكائن حسب وضيفة الخاصية فإذا كانت نص تكون من نوع String بدل من Variant وهكذا .........
أما الجملة PropertyChanged فهي تخبر الحدث UserControl_ReadProperties بأن يقوم بقراءة الخاصة لأن محتوياتها قد تم تغيره ثم بعد ذلك يخبر الحدثUserControl_WriteProperties ليقوم بحفظ التغيرات , و تكتب الجملة PropertyChanged بعدها تكتب اسم الخاصية موضوعة بين علامة تنصيص

الأحداث الخاصة بنافذة التصميم والتي تستخدم مع برمجة الخاصية :
1- حدث UserControl_InitProperties
يقع الحدث عند لحظة وضع الكائن على النافذة Form ليقوم بوضع القيم الافتراضية للخصائص .
فمثلاً نود عندما يتم وضع الكائن على النافذة أن تكون الخلفية سوداء , ولو قام المستخدم بتغيرها فلا مانع لأن الحدث لا يعمل إلا لحظة وضعة فقط , فإذا تغيرت الخاصية إلى أي لون سيقع الإجراء Let ليحصل على القيمة الجديدة للخاصية ثم بعدها يقع الحدث UserControl_ReadProperties ليقوم بقراءة التغير .

2- حدث UserControl_ReadProperties :
يقع هذا الحدث عند تشغيل البرنامج وعند إنهائه .
يستخدم لقراءة محتويات الخاصية كي يتم إظهارها للمستخدم
code:
  Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
       PropBag.ReadProperty (Name as String ,[DefaultValue])
  End Sub

تثمل PropBag.ReadProperty( المحث) لقراءة اسم الخاصية Name والقيمة الافتراضية للخاصة DefaultValue .
لا يقع عند وضع الكائن على النموذج لأنه في هذه الحالة يتم قراءة محتويات الخاصية من الحدث InitProperties ( لان هذا الحدث مسئول عن وضع فيم افتراضيه للخصائص كما ذكرت لحظة وضعه ) .
يمثل الأقواس [ ] فبي الصيغة أن ما بداخلهم ليس بالضرورة أن يوضع .

3- حدث UserControl_WriteProperties :
يستخدم هذا الحدث لحفظ التغير الجديد الذي حصلت علية الخاصية .
code:
  Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
        PropBag.WriteProperty (Name as String ,Value,[DefaultValue])
  End Sub

من الطبيعي أن أي شيء يتم تغيره في البرمجة لابد من حفظ هذا التغير لان القيم الجديدة تعتبر مخالفة للقيم الإقتراضيه , لذا يجب حفظ التغير , حتى عندما نغلق المشروع تماماُ نلاحظ أن عند تشغيله مره أخرى أن الخاصة احتفظت بالقيمة الجديدة , لتوضح أكثر لو طلبت منك برنامج يسأل المستخدم سؤال ما وفية خيار لا تسألني مرة أخرى , فعندما يضع علامة صح عند هذا الخيار لا يعيد البرنامج السؤال عند تشغيله مرة أخر , سوف تقول نخزن قيمة في ملف نصي أو في مسجل النظام ثم نفحصها فإذا كانت هذه القيمة 1 فيسأل أما إذا لم تكن لن يظهر السؤل , طيب في حال هذا الحدث أين يتم تخزين المحتويات الجديدة للخاصة ....!

يقوم هذا الحدث بحفظ التغيرات على النافذة الموضع بها فلو كان على نافذة Form يفتحها ثم يضع بها التغيرات الجديدة , والدالة التي تقوم يحفظ هذا الحدث (عبر الدالة الخاصة به) والتي هي :
code:
  PropBag.WriteProperty (Name as String ,Value,[DefaultValue])

وهذه الصيغة تكتب في ترويسة الملف From.frm كي تقوم بحفظ القيمة الجديدة أو القيمة الافتراضية حيث :

PropBag : تقوم بفتح الملف Form.frm إما لتكتب به الخاصية الجديدة WriteProperty أو لتقوم بقراءة القيمة التي وضعت بها ReadProperty فعند وضع النقطة بعد كتابة PropBag سيظهر لك الخياران المذكوران .
ولكن السؤال هنا هل يفتح الملف Form.frm ويكتب أو يقرأ منه بشكل عشوائي أم منضم :
بالطبع الجواب هوا بشكل منضم جداً دعنا نأخذ مثال على ذلك :

لنفترض أننا قمنا بعمل زر مثلاً وأسميناه Fawaz وأسمينا عائلته ButtonFawaz ثم وضعناه على النافذة Form فسيتم فتح الملف المذكور ثم يكتب به ما يلي (يعامل الملف في هذه الحالة كملف نصي ) : لكي يتم حفظ الكائن إذا تم إغلاق المشروع ولحظة الفتح يكون موجود كما ترك :
code:
Begin VB.ButtonFawaz Fawaz 

End   
 

طبعاً بالتأكيد أن لأ

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 11-07-2003 06:54 PM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

بسم الله الرحمن الرحيم
إخواني الكرام سرني كثير والله الحمد أنكم قد فهمتم الدروس السابقة , حيث كنت أظن أن الشرح ينقصه سهولة سرد المعلومات , فالحمد الله على ذلك .

سوف أحاول ربط الأحداث مع الخصائص أثناء تصميم الكائن بدلاً من تجزئها :

الدرس الخامس :
برمجة الخصائص :
الآن بعد الدروس السابقة يمكننا البدء عملياً في إنتاج كائنات Ocx :

برمجة الخصائص :
حيث عندما نقوم ببرمجة خاصية جديدة للكائن يجب أن نفهم أولاً : أن هناك ثلاثة أنواع من الخصائص :
1- خصائص مبنية على نافذة التصميم UserControl .
2- خصائص مبنية على كائن موجود على نافذة UserControl
3- خصائص جديدة يحددها المصمم .

( راجع الدرس الثاني )

الإجراءات العامة لبرمجة الخاصية :
الإجراء الأول :

code:
Public Property Get NameOFProperty() As Variant

End Property

الإجراء الثاني :
code:
Public Property Let NameOFProperty(ByVal vNewValue As Variant)

PropertyChanged "NameOFProperty" 
End Property 

الإجراء الأول :
ينطلق عندما يتم إعطاء قيمة الخاصة لمتغير أو لأي كائن أخر مثال :
هذا المثال (بافتراض تسمية الكائن المصمم بـButton والخاصية التابعة له بـ (Caption :
code:
Text1.Text = Button1.Caption

شرح أجزاء الإجراء :
Public : وهذا يحدد أن الخاصية عامة فإذا تم وضع Private بدل عنه فلن يتم وضع الخاصية في نافذة الخصائص لذا يجب تركهPublic , ( جرب ذلك ) .
Property Get : تحدد أن الإجراء هوا عبارة عن إجراء خاصية .
تسمح بإعطاء قيمة الخاصية لمتغير أو خاصية .
NameOFProperty : يمثل اسم الخاصية فمثلاً يمكن أن تكتب BackColor أو غيرها .
الإجراء الثاني :

ينطلق عندما يتم تغير القيمة السابقة للخاصية إلى قيمة جديدة مثلاُ :
code:
    Button1.Caption = Text1.Text 

حيث الباراميتر الموجود به : vNewValue يحصل على القيمة الجديدة ويكون نوع هذا الكائن حسب وضيفة الخاصية فإذا كانت نص تكون من نوع String بدل من Variant وهكذا .........
أما الجملة PropertyChanged فهي تخبر الحدث UserControl_ReadProperties بأن يقوم بقراءة الخاصة لأن محتوياتها قد تم تغيره ثم بعد ذلك يخبر الحدثUserControl_WriteProperties ليقوم بحفظ التغيرات , و تكتب الجملة PropertyChanged بعدها تكتب اسم الخاصية موضوعة بين علامة تنصيص

الأحداث الخاصة بنافذة التصميم والتي تستخدم مع برمجة الخاصية :
1- حدث UserControl_InitProperties
يقع الحدث عند لحظة وضع الكائن على النافذة Form ليقوم بوضع القيم الافتراضية للخصائص .
فمثلاً نود عندما يتم وضع الكائن على النافذة أن تكون الخلفية سوداء , ولو قام المستخدم بتغيرها فلا مانع لأن الحدث لا يعمل إلا لحظة وضعة فقط , فإذا تغيرت الخاصية إلى أي لون سيقع الإجراء Let ليحصل على القيمة الجديدة للخاصية ثم بعدها يقع الحدث UserControl_ReadProperties ليقوم بقراءة التغير .

2- حدث UserControl_ReadProperties :
يقع هذا الحدث عند تشغيل البرنامج وعند إنهائه .
يستخدم لقراءة محتويات الخاصية كي يتم إظهارها للمستخدم
code:
  Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
       PropBag.ReadProperty (Name as String ,[DefaultValue])
  End Sub

تثمل PropBag.ReadProperty( المحث) لقراءة اسم الخاصية Name والقيمة الافتراضية للخاصة DefaultValue .
لا يقع عند وضع الكائن على النموذج لأنه في هذه الحالة يتم قراءة محتويات الخاصية من الحدث InitProperties ( لان هذا الحدث مسئول عن وضع فيم افتراضيه للخصائص كما ذكرت لحظة وضعه ) .
يمثل الأقواس [ ] فبي الصيغة أن ما بداخلهم ليس بالضرورة أن يوضع .

3- حدث UserControl_WriteProperties :
يستخدم هذا الحدث لحفظ التغير الجديد الذي حصلت علية الخاصية .
code:
  Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
        PropBag.WriteProperty (Name as String ,Value,[DefaultValue])
  End Sub

من الطبيعي أن أي شيء يتم تغيره في البرمجة لابد من حفظ هذا التغير لان القيم الجديدة تعتبر مخالفة للقيم الإقتراضيه , لذا يجب حفظ التغير , حتى عندما نغلق المشروع تماماُ نلاحظ أن عند تشغيله مره أخرى أن الخاصة احتفظت بالقيمة الجديدة , لتوضح أكثر لو طلبت منك برنامج يسأل المستخدم سؤال ما وفية خيار لا تسألني مرة أخرى , فعندما يضع علامة صح عند هذا الخيار لا يعيد البرنامج السؤال عند تشغيله مرة أخر , سوف تقول نخزن قيمة في ملف نصي أو في مسجل النظام ثم نفحصها فإذا كانت هذه القيمة 1 فيسأل أما إذا لم تكن لن يظهر السؤل , طيب في حال هذا الحدث أين يتم تخزين المحتويات الجديدة للخاصة ....!

يقوم هذا الحدث بحفظ التغيرات على النافذة الموضع بها فلو كان على نافذة Form يفتحها ثم يضع بها التغيرات الجديدة , والدالة التي تقوم يحفظ هذا الحدث (عبر الدالة الخاصة به) والتي هي :
code:
  PropBag.WriteProperty (Name as String ,Value,[DefaultValue])

وهذه الصيغة تكتب في ترويسة الملف From.frm كي تقوم بحفظ القيمة الجديدة أو القيمة الافتراضية حيث :

PropBag : تقوم بفتح الملف Form.frm إما لتكتب به الخاصية الجديدة WriteProperty أو لتقوم بقراءة القيمة التي وضعت بها ReadProperty فعند وضع النقطة بعد كتابة PropBag سيظهر لك الخياران المذكوران .
ولكن السؤال هنا هل يفتح الملف Form.frm ويكتب أو يقرأ منه بشكل عشوائي أم منضم :
بالطبع الجواب هوا بشكل منضم جداً دعنا نأخذ مثال على ذلك :

لنفترض أننا قمنا بعمل زر مثلاً وأسميناه Fawaz وأسمينا عائلته ButtonFawaz ثم وضعناه على النافذة Form فسيتم فتح الملف المذكور ثم يكتب به ما يلي (يعامل الملف في هذه الحالة كملف نصي ) : لكي يتم حفظ الكائن إذا تم إغلاق المشروع ولحظة الفتح يكون موجود كما ترك :
code:
Begin VB.ButtonFawaz Fawaz 
 
End 

طبعاً بالتأكيد أن لأي كائن خصائص افتراضية لذا عند وضع الكائن سيتم كتابة هذه الخصائص الافتراضية للمرة الأولى فقط لتصبح كما يلي : (بافتراض أننا وضعناها هكذا مثلاً فستكتب على الملف : )
code:
   Begin VB.ButtonFawaz Fawaz 
      Caption         =   "Command1"
      Height          =   615
      Left            =   960
      TabIndex        =   0
      Top             =   960
      Width           =   2175
  End

حيث من سيقوم بكتابته هذه الخصائص هوا WriteProperty وما على ReadProperty إلى أن يقرأ هذه الخصائص كي يعطيها للكائن مره أخرى (في حال التغير , أو فتح المشروع , أو تشغيل البرنامج ... الخ)

سؤال أخر كيف يعرف المحرك أو المفسر أن هناك زر أسمه Fawaz موجود على الـ Form .
إجابة هذا السؤال هي مبنية على نفس الخطوات السابقة غير أن هناك بعض التغير وهوا أن (ترويسة) الزر تكتب بداخل ترويسة الـForm)) كما يلي :
code:
Begin VB.Form Form1 
   Caption         =   "Form1"
   ClientHeight    =   3195
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   4680
   LinkTopic       =   "Form1"
   ScaleHeight     =   3195
   ScaleWidth      =   4680
   StartUpPosition =   3  'Windows Default
   Begin VB.ButtonFawaz Fawaz 
      Caption         =   "Command1"
      Height          =   615
      Left            =   960
      TabIndex        =   0
      Top             =   960
      Width           =   2175
   End
End

وبهذه الترويسة يفهم Visual Basic كيف يتعامل مع الكائنات المثبتة على النوافذ أو الإجراءات الموجودة ...الخ ,
والآن عند تغير خاصية Caption للزر Fawaz من Command1 إلى CapCommand فمن سيقوم بحفظ هذه القيمة الجديدة وكيف يتم ذلك وأين ؟ .
إذا PropBag تقوم بالعمل عنا بفتح الملف ثم تحدد نوع الفتح للكتابة أو للقراءة . حيث لو لم توجد هذه الدالة لكتبنا نحن كود يقوم بهذا العمل وعد وغلط من الأخطاء والمشاكل التي قد تواجهنا في التحكم بها
ملاحظة هامة :
يمكنك من التلاعب بالخصائص المخزنة في الملف Form.frm فقم أولاً بفتح الملف بواسطة الدفتر ثم حاول التغير في قيم الخصائص , أو كأن تضيف أداة جديدة أو حدث جديد :
ابدأ بمشروع جديد ثم قم بحفظة على سطح المكتب ثم قم بفتح الملف Form.frm والذي يمثل مخزن للمعلومات التي تحتوي في المشروع , بواسطة الدفتر ثم توجه إلى أخر سطر يحتوي على End وضع السطر التالي :
code:
 Private Sub Form_Load()
  msgbox "تم إضافة الرسالة عن طريق الترويسة"
 End sub

قم الآن بحفظ الملف على صيغة TextDocuments ثم قم بفتح و بتشغيل البرنامج لتلاحظ ظهور الرسالة , توجه إلى واجهة الكود لترى أن الكود قد تم كتابته في الحدث Form_Load .
إضافة أداة جديدة :
أعد الخطوة السابقة وفي أخر سطر لترويسة الفورم قبل End ضع الكود التالي :
code:
   Begin VB.TextBox Text1 
      Height          =   375
      Left            =   1080
      TabIndex        =   1
      Text            =   "Fawaz2000"
      Top             =   0
      Width           =   2055
   End
 

قم بتشغيل البرنامج لتلاحظ ظهور مربع نص في أعلى النافذة , يمكنك أن تنضر وتعدل ما تشاء أو تضيف بحريتك .

تفيد ترويسة الملف السابق في حال كنت تريد مثلاً إنشاء نافذة أخرى بنفس تنسيق الأدوات الموجودة في النافذة الأولى , كتعديل بيانات خاطئة وهوا مفيد للمبرمجين ذوي الخبرات العالية .
-----------------------------

مثال عن كيفية عمل أول خاصية :

-----------------------------
سننشأ للكائن خاصية BackColor :
الخطوة الأولى :
في البداية نضع الإجراءين الخاصين بتكوين الخاصية , قم بكتابتهما في قسم الـتصريحات العامة General .
الطريقة الأسهل : اختر من قائمة Tools --- Add Procedure بعد ذلك سوف تظهر لك نافذة بها مجموعة من الخيارات أختر منها ما يلي :
خانة :Name والتي تحدد اسم الإجراء (وهوا طبعا سيكون إجراء اسم للخاصية) أكتب بها BackColor ثم من Type أختر Property بعد ذلك دع Scope على Public (عادة ما يكون افتراضي التأشير ) ثم اضغط زر موافق ليظهر لك الإجراءين التالين :
code:
Public Property Get BackColor() As Variant

End Property

Public Property Let BackColor(ByVal vNewValue As Variant)

End Property

الخطوة الثانية :
الآن : ( صلى على النبي , خذ نفس عميق ولنبدأ خطوة خطوة ) :
لاحظ أن الإجراءات عرفت كنوع Variant ونحن نصمم خاصية معروف أنها تأخذ بيانات ألوان لذا سيظهر لدينا نوع جديد من أنواع البيانات وهوا OLE_COLOR فبدل كل Variant للإجراءين بهذا النوع من البيانات ليصبح

code:
 BackColor() As OLE_COLOR 
 vNewValue As OLE_COLOR

هذا النوع من البيانات يعطي الخاصية الذي أسميناها BackColor قائمة أو لوح بالألوان مثل أي خاصية أخرى عندما تنقر عليها يظهر سهم به قائمة ألوان تحتوي على ألوان النظام System فلوا غير المستخدم هذه الخاصية إلى أحد الألوان عند هذه فعند تغير نضام الألوان بالكامل للحاسوب فسيتغير لون الخاصية تبعاً لنوع ألوان المختار والذي تم تغيره من نضام ألوان النظام ( الكمبيوتر) . أو تحتوي القائمة على ألوان محددة Palette لا تتأثر بتغير نضام الألوان المتبع للكمبيوتر .

الخطوة الثالثة :
نحدد قيمة افتراضية للخاصية , وهذه القيمة سوف تعمل فقط لحظة وضع فرد من أفراد الكائن على النموذج Form لأول مرة (تسجل تلقائياً في ترويسة الملف Form1.frm ولا يسجلها WriteProperty لان وضيفته فقط عند التغير ولكن حالياً لم يغير شيْ وإنما ليسا وضعنا قيمة افتراضيه ثم إذا تغيرت هذه القيمة سيسجل WriteProperty التغير في الترويسة .

خطوات تكوين القيمة الافتراضية :
نقوم بتعريف متغير في قسم التصريحات العامة ولنسمى هذا المتغير بـ Defult_BColor
ثم نحدد لون مثلاُ لون أسود (إلي يعجبك اختاره ) وهنا ملاحظة :
يمكنك أن تضع المتغير بالقيمة الافتراضية (ألون الأسود) في حدث Initialize. كما يلي :
code:
Private Sub UserControl_Initialize()
   Defult_BColor = vbBlack
End Sub

راجع حدث UserControl_Initialize
يمكن التعبير عن الألوان باستخدام الثوابت أو بالقيم فالقيمة المناظرة للثابت السابق هي &H00000000& لذا يفضل تعريف المتغير من نوع Long
ملاحظة :
عندما نتكلم عن قيمة افتراضية يعني أنها قيمة ثابتة , فيفضل في مثل هذه الحالة تعريف متغير القيمة الافتراضية كمتغير ثابت في قسم التصريحات العامة مثل :
code:
Const Defult_BColor As Long = vbBlack
'أو في حال عدم تحديد نوع البيانات تكون الصيغة 
Const Defult_BColor = vbBlack

وفي هذه الحالة طبعاُ لا داعي لاستخدام حدث Initialize
بعد ذلك سنحتاج لقراءة القيمة الافتراضية لحظة وضع الكائن لأول مرة في النموذج سنستخدم الحدث المسئول عن ذلك وهوا InitProperties ونضع بداخلة المتغير وطالما أننا نبرمج خاصية تورث من نافذة التصميم لذا سنعطي المتغير الافتراضي للخاصية التابعة لنافذة التصميم والذي ستعتبر كما قلت خاصية لزر :
code:
Private Sub UserControl_InitProperties()
 UserControl.BackColor = Defult_BColor
End Sub 

ففي هذه الحالة لحظة وضع الزر على النموذج سينطلق هذا الحدث ليعطي خلفية الزر ألون الأسود لذا سيظهر الزر بالون الأسود .


الخطوة الرابعة :
الحدث UserControl_ReadProperties:
والذي عن طريقة سنفتح الملف Form.frm ونقرأ القيمة التي تم تخزينها تلقائياً لحظة وضع الكائن والتي هي لون أسودvbBlack ونضعها كقيمة للخاصية BackColor كما يلي :

code:
Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
    PropBag.ReadProperty "BackColor", Defult_BColor
End Sub

ملاحظة :
القيمة الافتراضية والتي يحملها المتغير Defult_BColor تنفذ مرة واحدة فقط أي لحظة وضع الكائن على النموذج فإذا تم تغير الخاصية ثم أغلق المشروع لن يقرأ القيمة الافتراضية مره أخرى مادام الفرد موجود على النموذج . بل سيقرأ القيمة الجديدة التي وضعت في ترويسة الملف ليحملها كقيمة للخاصية .

نحن في هذه الحالة نصمم خاصية ترث خاصة BackColor لأداة التصميم لذا ففي هذه الحالة سنعطي ناتج القراءة من الحدث ReadProperties للخاصية UserControl.Bakclolor لذا سيتم وضع الكود التالي في الحدث ReadProperties كما يلي :

UserControl.BackColor = PropBag.ReadProperty ("BackColor", Defult_BColor)

حيث أي تغير في الخاصية ستتغير خلفية أداة التصميم والتي هي عبارة عن الزر عند وضعة على النموذج
راجع حدث ReadProperties .

الخطوة الخامسة :
لو طلب كائن أو متغير قيمة الخاصية , لذلك نحتاج أن نعطي الخاصية BackColor القيمة الموجودة حالياُ حتى تتمكن الخاصية BackColor أن تعطي المتغيرات القيمة التي تحتويها مثلا :
B = Button. BackColor ففي هذه الحالة تكون الـB قد أخذت نسخة من القيمة الحالية للخاصية .
ولكي نتيح ذلك نتوجه إلى الإجراء Property Get لنعطيه القيمة الجديدة , طيب أولا يجب أن نحصل على القيمة الجديدة , والقيمة الجديدة يحصل عليها أولاُ الإجراء Property Let عن طريق الباراميتر vNewValue لذا من إجراء إلى أخر سنحتاج وسيط نخزن فيه القيمة الجديدة , وفي هذه الحالة سنخزنه في الخاصية التابعة لأداة التصميم UserControl.BakColor ثم نخبر عن طريق PropertyChanged بأن الخاصية قد تم تغيرها كما يلي :
code:
Public Property Let BackColor(ByVal vNewValue As OLE_COLOR)
  UserControl.BackColor() = vNewValue
  PropertyChanged "BackColor"
End Property 

وبهاذ العمل يحدث أن تتغير خلفية الزر ثم يقوم الحدث WriteProperty بحفظ القيمة الجديدة والحدث ReadProperty يقوم بقراءة التغير الذي حصل للخاصية

ثم في الإجراء Property Get سنعطيه التغير وسنكتب الكود التالي :

code:
Public Property Get BackColor() As OLE_COLOR
 BackColor = UserControl.BackColor
End Property	

الخطوة الأخيرة :
والآ نقوم بحفظ القيمة التي تغيرت وذلك باستخدام الحدث الخاص UserControl_WriteProperties كما يلي :
code:
Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  PropBag.WriteProperty "BackColor",UserControl.BackColor,Defult_BColor 
End Sub
 

ملاحظة يمكن استخدام الدالة Exit Property في إجراءات الخاصية للخروج من الخاصية على حسب نوع المعالجة التي تودها (شبيهة بـ Exit For , Exit Do , Exit Function ..... الخ )

وبهذا نكون قد أتمينا برمجة خاصية تورث من كائن التصميم وما عليك إلا وضع الأداة على النموذج ثم جرب الخاصية الجديدة .


__________________
الإيمان يمان والحكمة يمانية

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 11-07-2003 07:00 PM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

fawaz2000
مبرمج محترف

تاريخ التسجيل » Nov 2001
البلد » اليمن - صنعاء
عدد المشاركات » 297
بمعدل » 0.43 مشاركة لكل يوم

أتمنا من الأخوه المشرفين حذف الدرس الخامس الأول المكرر ما ادري مارضي ينحذف وبعد حط الدرس مرتين أتمنا عمل اللازم
-------------------------------- :
والتمرين الذي سوف أقوم بشرحه الدرس القادم هوا كيفية إنشاء خاصية ForeColor والتي سنقوم بتوريثها من نافذة التصميم لذا حاول عزيز القارئ أن تقوم ببرمجة هذه الخاصية كي تتعود على حلول المشاكل التي قد تواجهك أثناء تصميم الكائن .
أتمنا أن أكون قد أوصلت المعلومات بشكل سليم وسهل إليكم , ,,,,,,, , وإلى درس قريب إنشاء الله .

أصبت بالزكام وقد أتوقف بعض الأيام عن كتابة الموضوع , وكتبت الموضوع اليوم بس مشعارف أيش إلي كتبته والى ما كتبته فعذراً منكم ودعوا لي بالشفاء ,

وجنبكم الله الزكام والسلام عليكم ورحمة الله وبركاته . أود من يعلق أن يكتب لي هل نجح في المهمة أم حصلت له مشكلة لنقوم بنقاشها , وسوف أترك الحل للمشاركين ليحاولوا في ذلك , وأنا معكم للمساعدة .

مرفق برنامج يوضع العمليات المذكورة :

لتنزيل الملف المرفق أنقر الرابط التالي: l5.zip بلا مسؤلية على المنتدى إن كان المرفق يحتوي على فيروسات أو وسائل تجسس
تم تحميل هذا الملف 97 مرة.


__________________
الإيمان يمان والحكمة يمانية

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

fawaz2000 غير متصل Old Post 11-07-2003 07:24 PM
إضغط هنا لمشاهدة هوية fawaz2000 إضغط هنا لإرسال رسالة شخصية لــ fawaz2000 إضغط هنا لإرسال بريد لــ fawaz2000 تفضل بزيارة صفحة fawaz2000 إبحث عن مواضيع fawaz2000 أضف fawaz2000 إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس

moma sader
طالب علم

تاريخ التسجيل » Sep 2002
البلد » الاردن
عدد المشاركات » 84
بمعدل » 0.24 مشاركة لكل يوم
Thumbs up مجهود رائع تستحق ...

مجهود رائع تستحق الشكر عليه
الى الامام و بعون الله
اخوك في الله
محمد الصدر


__________________
زوروا موقعي الشخصي
www.msking.jeeran.com

أخبر المراقب عن هذا الرد | رقم الـ IP | تحرير التوقيع

moma sader غير متصل Old Post 11-07-2003 07:46 PM
إضغط هنا لمشاهدة هوية moma sader إضغط هنا لإرسال رسالة شخصية لــ moma sader إضغط هنا لإرسال بريد لــ moma sader تفضل بزيارة صفحة moma sader إبحث عن مواضيع moma sader أضف moma sader إلى قائمة أصدقائك تحرير/حذف رسالة رد بإقتباس
جميع الأوقات بتوقيت » المملكة العربية السعودية | الوقت الآن » 10:05 PM أكتب موضوع جديد    أكتب رد
 عدد الصفحات » (4):   1   2   3   4   الموضوع السابق   الموضوع التالي
[ عرض نسخة للطبع | إرسال الموضوع لصديق | إستقبل جديد هذا الموضوع ]

الإنتقال إلى:
تقييم هذا الموضوع:

قوانين المنتدى:
notتستطيع كتابة موضوع جديد                           
notتستطيع كتابة رد جديد
not تستطيع إرسال مرفقات جديدة
not تستطيع تعديل مشاركتك
شفرات HTML » غير متاح
شفرات vB » متاح
الإبتسامات » متاح
شفرة [IMG] » متاح
 

< إتصـــل بـنـــا - فيجوال بيسك للعرب > 
Copyright ©2000, 2001, Jelsoft Enterprises Limited.